home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / rangemenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  10KB  |  313 lines

  1. /*
  2.  * Create and destroy the week view range menu, which allows entry of the
  3.  * time of the left and right margin of the week view. This menu is
  4.  * installed from the Config pulldown.
  5.  *
  6.  *    destroy_weekrange_popup()
  7.  *    create_weekrange_popup()
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <time.h>
  12. #include <Xm/Xm.h>
  13. #include <Xm/DialogS.h>
  14. #include <Xm/Form.h>
  15. #include <Xm/Frame.h>
  16. #include <Xm/RowColumn.h>
  17. #include <Xm/LabelP.h>
  18. #include <Xm/LabelG.h>
  19. #include <Xm/PushBP.h>
  20. #include <Xm/PushBG.h>
  21. #include <Xm/ToggleB.h>
  22. #include <Xm/TextF.h>
  23. #include <Xm/Protocols.h>
  24. #include "cal.h"
  25.  
  26. static void        warn_callback(), user_callback(), done_callback();
  27. extern void        help_callback();
  28.  
  29. extern Display        *display;    /* everybody uses the same server */
  30. extern struct config    config;        /* global configuration data */
  31. extern Pixel        color[NCOLS];    /* colors: COL_* */
  32. extern struct list    *mainlist;    /* list of all schedule entries */
  33.  
  34. static BOOL        have_shell;    /* message popup exists if TRUE */
  35. static Widget        shell;        /* popup menu shell */
  36. static Widget        min, max;    /* min and max hour text widgets */
  37.  
  38.  
  39. /*
  40.  * destroy a popup. Remove it from the screen, and destroy its widgets.
  41.  * It's too much trouble to keep them for next time.
  42.  */
  43.  
  44. destroy_weekrange_popup()
  45. {
  46.     char            *string;    /* contents of text widget */
  47.     int            b, e;
  48.  
  49.     if (have_shell) {
  50.         string = XmTextFieldGetString(min);
  51.         b = atoi(string);
  52.         XtFree(string);
  53.  
  54.         string = XmTextFieldGetString(max);
  55.         e = atoi(string);
  56.         XtFree(string);
  57.  
  58.         if (e == 0)    e = 24;
  59.         if (e <= b)    e = e+1;
  60.         if (e > 24)    e = 24;
  61.         if (e <= b)    b = e-1;
  62.  
  63.         config.week_minhour = b;
  64.         config.week_maxhour = e;
  65.  
  66.         XtPopdown(shell);
  67.         XTDESTROYWIDGET(shell);
  68.         have_shell = FALSE;
  69.         mainlist->modified = TRUE;
  70.         draw_week_calendar();
  71.     }
  72. }
  73.  
  74.  
  75. /*
  76.  * create a week view range popup as a separate application shell. The
  77.  * popup is initialized with data from config.
  78.  */
  79.  
  80. create_weekrange_popup()
  81. {
  82.     Widget            form, form2, w, text, help;
  83.     Arg            args[20];
  84.     int            n;
  85.     Atom            closewindow;
  86.  
  87.     destroy_weekrange_popup();
  88.  
  89.     n = 0;
  90.     XtSetArg(args[n], XmNdeleteResponse,    XmDO_NOTHING);        n++;
  91.     XtSetArg(args[n], XmNiconic,        False);            n++;
  92.     shell = XtAppCreateShell("Week view range", "plan",
  93.             applicationShellWidgetClass, display, args, n);
  94. #    ifdef EDITRES
  95.     XtAddEventHandler(shell, (EventMask)0, TRUE, 
  96.              _XEditResCheckMessages, NULL);
  97. #    endif
  98.     set_icon(shell, 1);
  99.     form = XtCreateManagedWidget("rangeform1", xmFormWidgetClass,
  100.             shell, NULL, 0);
  101.     XtAddCallback(form, XmNhelpCallback, help_callback,(XtPointer)"range");
  102.  
  103.                             /*-- buttons --*/
  104.     n = 0;
  105.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  106.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  107.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  108.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  109.     XtSetArg(args[n], XmNwidth,        80);            n++;
  110.     w = XtCreateManagedWidget("Done", xmPushButtonWidgetClass,
  111.             form, args, n);
  112.     XtAddCallback(w, XmNactivateCallback, done_callback, (XtPointer)0);
  113.     XtAddCallback(w, XmNhelpCallback,     help_callback, (XtPointer)
  114.                                 "range_done");
  115.  
  116.     n = 0;
  117.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  118.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  119.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  120.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  121.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  122.     XtSetArg(args[n], XmNwidth,        80);            n++;
  123.     help = XtCreateManagedWidget("Help", xmPushButtonWidgetClass,
  124.             form, args, n);
  125.     XtAddCallback(help, XmNactivateCallback, help_callback,
  126.                             (XtPointer)"range");
  127.     XtAddCallback(help, XmNhelpCallback,     help_callback,
  128.                             (XtPointer)"range");
  129.  
  130.                             /*-- frame --*/
  131.     n = 0;
  132.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  133.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  134.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_WIDGET);    n++;
  135.     XtSetArg(args[n], XmNbottomWidget,    w);            n++;
  136.     XtSetArg(args[n], XmNbottomOffset,    16);            n++;
  137.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  138.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  139.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  140.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  141.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  142.     w = XtCreateManagedWidget("", xmFrameWidgetClass,
  143.             form, args, n);
  144.     form2 = XtCreateManagedWidget("rangeform2", xmFormWidgetClass,
  145.             w, NULL, 0);
  146.                             /*-- min --*/
  147.     n = 0;
  148.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  149.     XtSetArg(args[n], XmNtopOffset,        18);            n++;
  150.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  151.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  152.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  153.     w = XtCreateManagedWidget("Begin week view at",
  154.             xmLabelWidgetClass, form2, args, n);
  155.     XtAddCallback(w, XmNhelpCallback, help_callback,
  156.                         (XtPointer)"range_min");
  157.     n = 0;
  158.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  159.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  160.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  161.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  162.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  163.     XtSetArg(args[n], XmNwidth,        80);            n++;
  164.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  165.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  166.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  167.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  168.     min = XtCreateManagedWidget(" ", xmTextFieldWidgetClass,
  169.             form2, args, n);
  170.     XtAddCallback(min, XmNhelpCallback, help_callback,
  171.                         (XtPointer)"range_min");
  172.     n = 0;
  173.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  174.     XtSetArg(args[n], XmNtopOffset,        18);            n++;
  175.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  176.     XtSetArg(args[n], XmNleftWidget,    min);            n++;
  177.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  178.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  179.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  180.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  181.     XtCreateManagedWidget("o'clock", xmLabelWidgetClass,
  182.             form2, args, n);
  183.     XtAddCallback(w, XmNhelpCallback, help_callback,
  184.                         (XtPointer)"range_min");
  185.  
  186.                             /*-- max --*/
  187.     n = 0;
  188.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  189.     XtSetArg(args[n], XmNtopWidget,        min);            n++;
  190.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  191.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  192.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  193.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  194.     w = XtCreateManagedWidget("End week view at",
  195.             xmLabelWidgetClass, form2, args, n);
  196.     XtAddCallback(w, XmNhelpCallback, help_callback,
  197.                         (XtPointer)"range_max");
  198.     n = 0;
  199.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  200.     XtSetArg(args[n], XmNtopWidget,        min);            n++;
  201.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  202.     XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);    n++;
  203.     XtSetArg(args[n], XmNleftWidget,    min);            n++;
  204.     XtSetArg(args[n], XmNwidth,        80);            n++;
  205.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  206.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  207.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  208.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  209.     max = XtCreateManagedWidget("", xmTextFieldWidgetClass,
  210.             form2, args, n);
  211.     XtAddCallback(max, XmNhelpCallback, help_callback,
  212.                         (XtPointer)"range_max");
  213.     n = 0;
  214.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  215.     XtSetArg(args[n], XmNtopWidget,        min);            n++;
  216.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  217.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  218.     XtSetArg(args[n], XmNleftWidget,    min);            n++;
  219.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  220.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  221.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  222.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  223.     XtCreateManagedWidget("o'clock", xmLabelWidgetClass,
  224.             form2, args, n);
  225.     XtAddCallback(w, XmNhelpCallback, help_callback,
  226.                         (XtPointer)"range_max");
  227.  
  228.                             /*-- show warnings --*/
  229.     n = 0;
  230.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  231.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  232.     XtSetArg(args[n], XmNtopWidget,        max);            n++;
  233.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  234.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  235.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  236.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  237.     XtSetArg(args[n], XmNset,        config.weekwarn);    n++;
  238.     w = XtCreateManagedWidget("Show advance-warning times",
  239.             xmToggleButtonWidgetClass,
  240.             form2, args, n);
  241.     XtAddCallback(w, XmNvalueChangedCallback, warn_callback, (XtPointer)0);
  242.     XtAddCallback(w, XmNhelpCallback, help_callback,
  243.                         (XtPointer)"range_warn");
  244.  
  245.                             /*-- show username --*/
  246.     n = 0;
  247.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  248.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  249.     XtSetArg(args[n], XmNtopWidget,        w);            n++;
  250.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  251.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  252.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  253.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  254.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  255.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  256.     XtSetArg(args[n], XmNset,        config.weekuser);    n++;
  257.     w = XtCreateManagedWidget("Show user names in bar labels",
  258.             xmToggleButtonWidgetClass,
  259.             form2, args, n);
  260.     XtAddCallback(w, XmNvalueChangedCallback, user_callback, (XtPointer)0);
  261.     XtAddCallback(w, XmNhelpCallback, help_callback,
  262.                         (XtPointer)"range_user");
  263.  
  264.     XtPopup(shell, XtGrabNone);
  265.     closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
  266.     XmAddWMProtocolCallback(shell, closewindow,
  267.                     done_callback, (XtPointer)shell);
  268.  
  269.     print_text_button(min, "%d", config.week_minhour);
  270.     print_text_button(max, "%d", config.week_maxhour);
  271.  
  272.     have_shell = TRUE;
  273. }
  274.  
  275.  
  276. /*-------------------------------------------------- callbacks --------------*/
  277. /*
  278.  * All of these routines are direct X callbacks.
  279.  */
  280.  
  281. /*ARGSUSED*/
  282. static void done_callback(widget, item, data)
  283.     Widget                widget;
  284.     int                item;
  285.     XmToggleButtonCallbackStruct    *data;
  286. {
  287.     destroy_weekrange_popup();
  288. }
  289.  
  290.  
  291. /*ARGSUSED*/
  292. static void warn_callback(widget, item, data)
  293.     Widget                widget;
  294.     int                item;
  295.     XmToggleButtonCallbackStruct    *data;
  296. {
  297.     config.weekwarn ^= TRUE;
  298.     mainlist->modified = TRUE;
  299.     draw_week_calendar();
  300. }
  301.  
  302.  
  303. /*ARGSUSED*/
  304. static void user_callback(widget, item, data)
  305.     Widget                widget;
  306.     int                item;
  307.     XmToggleButtonCallbackStruct    *data;
  308. {
  309.     config.weekuser ^= TRUE;
  310.     mainlist->modified = TRUE;
  311.     draw_week_calendar();
  312. }
  313.